package com.demo.java.OD201_250.OD244;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【整理扑克牌】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146027265
 */
public class OdMain {
        public static void main(String[] args) {
            try (Scanner scanner = new Scanner(System.in)) {
                String line = scanner.nextLine();  // 读取输入的一行数据
                String[] split = line.split(" ");  // 将输入的数字用空格分开
                Map<Integer, Integer> map = new HashMap<>();  // 用Map统计每种牌的数量
                for (String s : split) {
                    int number = Integer.parseInt(s);  // 转换为整数
                    map.put(number, map.getOrDefault(number, 0) + 1);  // 更新每个数字出现的次数
                }

                // 自定义排序规则，按数量降序，数量相同则按牌面大小降序
                Comparator<Map.Entry<Integer, Integer>> entryComparator = (e1, e2) -> {
                    if (!e2.getValue().equals(e1.getValue())) {
                        return e2.getValue() - e1.getValue();  // 比较数量
                    } else {
                        return e2.getKey() - e1.getKey();  // 数量相同，按面值降序
                    }
                };

                List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());  // 将Map转换为List

                StringBuilder builder = new StringBuilder();  // 用来拼接输出结果
                while (list.size() > 0) {
                    list.sort(entryComparator);  // 排序

                    Map.Entry<Integer, Integer> first = list.get(0);  // 获取数量最多的牌

                    // 如果有四张相同的牌，优先输出
                    if (first.getValue() >= 4) {
                        append(builder, first.getKey(), 4);  // 输出四张
                        if (first.getValue() - 4 == 0) {
                            list.remove(0);  // 移除已处理的牌
                        } else {
                            first.setValue(first.getValue() - 4);  // 更新剩余的数量
                        }
                        continue;
                    }

                    // 如果有三张相同的牌且有两张牌，优先输出三张和两张组合
                    if (first.getValue() == 3 && list.size() > 1) {
                        Map.Entry<Integer, Integer> second = list.get(1);  // 获取第二个面值
                        if (second.getValue() >= 2) {
                            append(builder, first.getKey(), 3);  // 输出三张
                            append(builder, second.getKey(), 2);  // 输出两张
                            if (second.getValue() == 2) {
                                list.remove(1);  // 移除已处理的牌
                            } else {
                                second.setValue(second.getValue() - 2);  // 更新剩余的数量
                            }
                            list.remove(0);  // 移除已处理的牌
                            continue;
                        } else {
                            append(builder, first.getKey(), 3);  // 只输出三张
                            list.remove(0);  // 移除已处理的牌
                            continue;
                        }
                    }

                    // 处理剩余的情况，按数量依次输出
                    int size = list.size();
                    for (int i = 0; i < size; i++) {
                        append(builder, list.get(0).getKey(), list.get(0).getValue());  // 输出剩余的牌
                        list.remove(0);  // 移除已处理的牌
                    }
                }
                System.out.print(builder.substring(0, builder.length() - 1));  // 输出结果
            }
        }

        // 辅助方法，用于拼接结果
        private static void append(StringBuilder builder, int number, int count) {
            for (int i = 0; i < count; i++) {
                builder.append(number).append(" ");  // 拼接每张牌
            }
        }
}